15. Grails 与 Hibernate

如果 GORM (Grails Object Relational Mapping)没有你想象的那么足够灵活,作为选择,你可以使用Hibernate映射你的domain类. 要做到这点,需要在你项目的grails-app/conf/hibernate目录创建一个hibernate.cfg.xml文件并为你的domain类对应HBM映射文件 .

更多关于这方面的信息,请查看Hibernate站点的文件映射

这允许你映射Grails domain类适用于更广的遗留系统并更加灵活的创建数据库模式 .

Grails也允许你在Java中编写domain类或重用以存在的domain model,这些都通过使用Hibernate来映射 . 你需要做的是放置必须的hibernate.cfg.xml 文件和对应的映射文件在grails-app/conf/hibernate目录中 .

另外,令人兴奋的是你仍然可以调用GORM中所有动态之久和查询方法 !

15.1 通过Hibernate注解映射

Grails 也支持通过Hibernate的Java 5.0注解支持来创建domain类映射. 为了做到这点,你需要通过设置DataSource 中的configClass属性告诉Grails你要使用注解配置,如下 :

import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration
dataSource {
	configClass = GrailsAnnotationConfiguration.class
   … // remaining properties
}

这就是它的配置!确保你安装了Java 5.0,因为这需要使用注解. 现在,为了创建一个注解类,我们在src/java中简单的创建一个新的Java类并使用EJB 3.0规范来定义注解(详情 参考Hibernate Annotations Docs):

package com.books;
@Entity
public class Book {
    private Long id;
    private String title;
    private String description;
    private Date date;

@Id @GeneratedValue public Long getId() { return id; }

public void setId(Long id) { this.id = id; }

public String getTitle() { return title; }

public void setTitle(String title) { this.title = title; }

public String getDescription() { return description; }

public void setDescription(String description) { this.description = description; } }

一旦完成,你需要使用Hibernate sessionFactory注册这个类 ,为了做到这点,你需要添加 如下的grails-app/conf/hibernate/hibernate.cfg.xml 文件:

<!DOCTYPE hibernate-configuration SYSTEM
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <mapping package="com.books" />
        <mapping class="com.books.Book" />
    </session-factory>
</hibernate-configuration>

当Grails加载时,会注册这个类必要的动态方法 . 查看Scaffolding了解 Hibernate domain 类中可以做的其他事情.

15.2 进一步阅读

Grails提交者, Jason Rudolph,花了许多时间写了许多关于通过自定义Hibernate使用Grails: